闲话 22.10.24

闲话

晚上在外面逛了几圈
所以今天的闲话发得比较的晚

感觉生活水平需要提升于是在找游戏人生的壁纸(
所以有好心人投喂几张吗(

今日模拟赛有交互题
“不保证评测交互库和下发交互库相同”
然后可以直接调用交互库里的函数
连namespace的名称都没改
连变量名都没改
三行就能ac是吧

[今天脑内循环的还是Aster 很推荐去看看!]
[霓虹的世界……]

杂题

好在我还留了一道题没写
要不然没东西可写了(

[国家集训队]整数的lqp拆分

定义 N 的整数拆分为满足 i=1nai=N s.t. ai>0 的有序序列 ai。定义一个 N 的整数拆分 ai 的权值为 i=1nFai,其中 Fi 为斐波那契数列,满足 F0=0,F1=1,Fi=Fi1+Fi2

给定 N,求其整数拆分权值之和对 109+7 取模的值。

N1010000

某人无意识中出了这题的弱化版。所以写了。

通过长时间的研究我们发现了计算对于 n 的整数拆分的总数有一个很简单的递推式,但是因为这个递推式实在太简单了,如果出这样的题目,大家会对比赛毫无兴趣的。
- 来自题面

其实确实。

我们考虑先生成这个 n 的整数拆分的总数。假设 [xn]F(x) 为答案,不难发现我们可以将其拆分为由 i 个整数生成的方案数的总和。当前是由全体正整数生成,因此立得

F(x)=i=0(11x)i=1111x

然后自然推广得到假设用数列 G(x) 来取 n 的拆分数,若 [xn]F(x) 为答案则有

F(x)=11G(x)

回到题目。由斐波那契数列的递推式不难得到斐波那契数列的生成函数

G(x)=x1xx2

因此有答案数列

F(x)=11G(x)=1xx212xx2

到这里有两种做法(

1. 直接做

我们不难得到分母 112xx2 对应数列 ai 的递推式:

an=2an1+an2

考虑分子的贡献:

aans=anan1an2=an1

因此得到答案的递推式,直接做矩乘就是 O(logn) 的。但是还可以接着推。

考虑斐波那契数列通项公式的求法。我们设 an=pan1,得到

p2an22pan2an2=0

解得

p=1±2

直接设

an=c1(12)n+c2(1+2)n

带入特值能得到

{c1=2122c2=2+122

整理得到

an=24((1+2)n+1(12)n+1)

考虑 x22(mod109+7) 的解。扔进什么板子里能得到 x=59713600。带入计算就可以 O(logn) 求解。

答案减一即可。

2. 部分分式分解

1xx212xx2=1+x12xx2

根据部分分式定理,考虑待定系数得到

x12xx2=A1px+B1qx=(A+B)+(Aq+bP)x1(p+q)x+pqx2

然后就是一通对比系数。这部分是 dirty work,总而言之我们能得到

x12xx2=24(11(1+2)x11(12)x)

化简可以得到和 1. 相同的结论。

于是我们得到了递推式。在读入时将 n109+6 取模即可。

code
#include <bits/stdc++.h>
using namespace std;
#define int long long
#ifdef ONLINE_JUDGE
    char buf[1<<21], *p1 = buf, *p2 = buf;  inline char getc() { return (p1 == p2 and (p2 = (p1 = buf) + fread(buf, 1, 1<<21, stdin), p1 == p2) ? EOF : *p1++); }
    #define getchar getc
#endif
#define rep(i,a,b) for (register int i = (a), i##_ = (b) + 1; i < i##_; ++i)
#define pre(i,a,b) for (register int i = (a), i##_ = (b) - 1; i > i##_; --i)
const int mod = 1e9 + 7, phi_m = mod - 1, sqrt_2 = 59713600;
int n;
int qp(int a, int b) { int ret = 1; for (; b; a = 1ll * a * a % mod, b >>= 1) if (b & 1) ret = 1ll * ret * a % mod; return ret; }

signed main() {
	char c; while (isdigit(c = getchar())) n = (1ll * n * 10 + c - '0') % phi_m;
	cout << 1ll * sqrt_2 * 250000002 % mod * (qp(sqrt_2 + 1, n) - qp(1 - sqrt_2 + mod, n) + mod) % mod;
}
posted @   joke3579  阅读(62)  评论(2编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示